package cn.highedu.coolshark.account.service;


import cn.highedu.coolshark.account.pojo.dto.AdminAddNewDTO;
import cn.highedu.coolshark.account.pojo.dto.AdminListParamPagedDTO;
import cn.highedu.coolshark.account.pojo.dto.AdminLoginInfoDTO;
import cn.highedu.coolshark.account.pojo.dto.AdminUpdateDTO;
import cn.highedu.coolshark.account.pojo.vo.AdminListItemVO;
import cn.highedu.coolshark.account.pojo.vo.AdminLoginInfoVO;
import cn.highedu.coolshark.account.pojo.vo.AdminStandardVO;
import cn.highedu.coolshark.account.pojo.vo.JwtVO;
import cn.highedu.coolshark.common.PagedVO;
import cn.highedu.coolshark.common.ServiceException;

import java.util.List;

/**
 * 处理管理员数据的业务接口
 * @author java@tedu.cn
 * @version 0.0.1
 */
public interface IAdminService {
    /**
     * 类别“是否启用”的状态文本
     */
    String ENABLE_TEXT[] = {"禁用", "启用"};

    /**
     * 添加管理员
     * @param adminAddNewDTO 管理员数据
     */
    void addNew(AdminAddNewDTO adminAddNewDTO);

    /**
     * 删除管理员，系统管理员不能删除！
     * @param id 管理员id
     * @throws ServiceException 如果尝试删除系统管理员，则抛出此异常
     */
    void delete(Long id);


    /**
     * 批量删除管理员
     * @param ids 管理员id数组
     *            系统管理员不能删除！
     *            如果尝试删除系统管理员，则抛出异常
     *            如果ids为null或长度为0，则不执行任何操作
     * @throws ServiceException 如果尝试删除系统管理员，则抛出此异常
     *                          如果删除数量与ids长度不一致，则抛出此异常
     */
    void delete(Long[] ids);


    /**
     * 查询管理员列表
     * @return 管理员列表
     */
    List<AdminListItemVO> list();

    /**
     * 根据id查询管理员详情
     * @param id 管理员id
     * @return 匹配的管理员详情
     */
    AdminStandardVO getAdminById(Long id);

    /**
     * 更新管理员信息
     * @param id 管理员id
     * @param adminUpdateDTO 管理员数据
     * @throws ServiceException 如果尝试修改系统管理员，则抛出此异常
     */
    void update(Long id,  AdminUpdateDTO adminUpdateDTO);

    /**
     * 为管理员添加角色
     * @param adminId 管理员id        1
     * @param roleIds 角色id数组      1,2,3
     */
    void addRoles(Long adminId, Long[] roleIds);

    /**
     * 根据用户名查询管理员数据
     */
    AdminLoginInfoVO getAdminLoginInfo(String username);

    /**
     * 根据登录表单信息登录系统
     * @param adminLoginInfoDTO 登录表单信息
     * @throws ServiceException 如果登录失败，则抛出此异常
     * @return 登录成功返回JWT令牌
     */
    JwtVO login(AdminLoginInfoDTO adminLoginInfoDTO);

    /**
     * 登出
     */
    void logout(String jwtToken);

    /**
     * 启用/禁用管理员
     */
    void changeEnable(Long id, Integer enable);

    /**
     * 查询管理员列表
     * @param adminListParamPagedDTO 查询条件
     */
    PagedVO<AdminListItemVO> list(AdminListParamPagedDTO adminListParamPagedDTO);

}
